package com.lx.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * 雒鑫
 */
@Component
public class RedisUtil {
    //为当前IP定制设置一个键值
    private static final String KEY = "limit:key:";
    //设置每个IP的有效时间为60s
    private long TimeOut = 60;
    //设置一个IP在有效时间内的最大访问次数为10次

    private long limit = 10;
    @Autowired
    //通过注解注入操作redis的一个实例
    private RedisTemplate redisTemplate;

    public boolean check(String ip) {
        //将参数ip与指定的key进行拼接 充当redis缓存当中的一个键
        String KeyIp = KEY + ip;
        //首先 通过redisTemplate.opsForValue()获取到操作redis中string类型的一个对象
        //然后通过这个对象设置键值自增
        Long count = redisTemplate.opsForValue().increment(KeyIp);

        //当ip是第一次发送请求的时候做出一个校验
        if (count == 1) {
            //通过实例的expire方法来设置一个具有有效期限的键KeyIp 单位是秒;
            redisTemplate.expire(KeyIp, TimeOut, TimeUnit.SECONDS);
        }
        //返回true 则允许该次请求通过 否则不能
        boolean result = count <= limit;
        return result;
    }

    //这里通过该方法可以进行设置当此请求的最大时间 以及该段时间类的最大次数
    public void setRedis(long timeOut, long limit) {
        TimeOut = timeOut;
        this.limit = limit;
    }
}
